package com.laogao.lesson034.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfiguration {

    /**
     * 订单相关的 RabbitMQ 配置类。
     * 这是一个静态内部类，用于封装订单模块的 RabbitMQ 配置。
     */
    @Configuration
    public static class Order {

        // 定义 Exchange 名称，用于消息路由。
        public static final String EXCHANGE = "orderExchange";

        // 定义队列名称，用于存储订单相关的消息。
        public static final String QUEUE = "orderQueue1";

        // 定义 RoutingKey，用于将消息从 Exchange 路由到指定队列。
        public static final String ROUTING_KEY = "order";

        /**
         * 配置一个 Direct 类型的 Exchange。
         * Direct Exchange 会根据 RoutingKey 将消息精确匹配到绑定的队列。
         *
         * @return DirectExchange 实例。
         */
        @Bean
        public DirectExchange orderExchange() {
            // 参数说明：
            // 1. EXCHANGE：Exchange 的名称。
            // 2. true：表示该 Exchange 是持久化的（即使 RabbitMQ 重启，Exchange 也不会丢失）。
            // 3. false：表示该 Exchange 不是自动删除的（当没有队列绑定时不会被删除）。
            return new DirectExchange(EXCHANGE, true, false);
        }

        /**
         * 配置一个队列。
         * 该队列用于存储订单相关的消息。
         *
         * @return Queue 实例。
         */
        @Bean
        public Queue orderQueue() {
            // 参数说明：
            // 1. QUEUE：队列的名称。
            // 2. true：表示该队列是持久化的（即使 RabbitMQ 重启，队列中的消息也不会丢失）。
            return new Queue(QUEUE, true);
        }

        /**
         * 绑定队列到 Exchange。
         * 通过 Binding 将队列与 Exchange 关联起来，并指定 RoutingKey。
         *
         * @return Binding 实例。
         */
        @Bean
        public Binding orderExchangeBindOrderQueue() {
            // 参数说明：
            // 1. QUEUE：目标队列的名称。
            // 2. Binding.DestinationType.QUEUE：表示目标是一个队列（也可以是 Exchange）。
            // 3. EXCHANGE：源 Exchange 的名称。
            // 4. ROUTING_KEY：用于消息路由的 RoutingKey。
            // 5. null：额外的参数（这里不需要）。
            return new Binding(QUEUE, Binding.DestinationType.QUEUE, EXCHANGE, ROUTING_KEY, null);
        }
    }
}